// 引入 axios 库，用于发起 HTTP 请求
const axios = require('axios');

// 创建一个自定义的 axios 实例，命名为 apiClient
// 这里可以对实例进行一些全局配置
const apiClient = axios.create({
    // 基础 URL，后续请求的相对路径会拼接在这个基础 URL 后面
    baseURL: 'https://example.com', // 请替换为实际的 API 基础地址
    // 请求超时时间，单位为毫秒
    // 如果请求在 5000 毫秒（即 5 秒）内未完成，将触发超时错误
    timeout: 5000,
    // 设置请求头
    headers: {
        'Content-Type': 'application/json'
    }
});

/**
 * 发起 PUT 请求来修改数据
 * @param {Object} params - 要发送的数据
 * @returns {Promise} - 返回一个 Promise 对象，用于处理请求结果
 */
export function putPile(params) {
    // 打印当前接口要修改的数据
    console.log('当前接口修改数据 ', params);
    // 使用 apiClient 发起 PUT 请求
    return apiClient({
        url: `/pileData`,
        method: "PUT",
        data: params
    });
}

/**
 * 发起 GET 请求来获取数据
 * @param {Object} params - 可选的查询参数
 * @returns {Promise} - 返回一个 Promise 对象，用于处理请求结果
 */
export function getPile(params = {}) {
    // 打印当前接口要获取数据的查询参数
    console.log('当前接口获取数据的查询参数 ', params);
    // 使用 apiClient 发起 GET 请求
    return apiClient({
        url: `/pileData`,
        method: "GET",
        params: params
    });
}

/**
 * 发起 POST 请求来创建数据
 * @param {Object} params - 要发送的数据
 * @returns {Promise} - 返回一个 Promise 对象，用于处理请求结果
 */
export function postPile(params) {
    // 打印当前接口要创建的数据
    console.log('当前接口创建数据 ', params);
    // 使用 apiClient 发起 POST 请求
    return apiClient({
        url: `/pileData`,
        method: "POST",
        data: params
    });
}

/**
 * 发起 DELETE 请求来删除数据
 * @param {Object} params - 要删除的数据的相关参数，通常包含 ID 等信息
 * @returns {Promise} - 返回一个 Promise 对象，用于处理请求结果
 */
export function deletePile(params) {
    // 打印当前接口要删除的数据的参数
    console.log('当前接口删除数据的参数 ', params);
    // 使用 apiClient 发起 DELETE 请求
    return apiClient({
        url: `/pileData`,
        method: "DELETE",
        data: params
    });
}

/**
 * 发起下载文件的请求
 * @param {string} fileUrl - 文件的相对或绝对 URL
 * @returns {Promise} - 返回一个 Promise 对象，用于处理请求结果
 */
export function downloadFile(fileUrl) {
    console.log('当前接口下载文件的 URL ', fileUrl);
    return apiClient({
        url: fileUrl,
        method: "GET",
        responseType: 'blob' // 设置响应类型为二进制流，用于处理文件下载
    }).then(response => {
        // 创建一个临时的 URL 对象，用于生成下载链接
        const url = window.URL.createObjectURL(new Blob([response.data]));
        // 创建一个 <a> 元素，用于触发下载
        const link = document.createElement('a');
        link.href = url;
        // 从响应头中获取文件名，如果没有则使用默认文件名
        const contentDisposition = response.headers['content-disposition'];
        if (contentDisposition) {
            const fileNameMatch = contentDisposition.match(/filename="?([^"]+)"?/);
            if (fileNameMatch) {
                link.setAttribute('download', fileNameMatch[1]);
            }
        }
        // 将 <a> 元素添加到文档中
        document.body.appendChild(link);
        // 模拟点击 <a> 元素来触发下载
        link.click();
        // 移除 <a> 元素和临时 URL 对象
        document.body.removeChild(link);
        window.URL.revokeObjectURL(url);
        return response;
    }).catch(error => {
        console.error('下载文件出错:', error.message);
        throw error;
    });
}

/**
 * 发起文件上传请求
 * @param {File} file - 要上传的文件对象
 * @returns {Promise} - 返回一个 Promise 对象，用于处理请求结果
 */
export function uploadFile(file) {
    console.log('当前接口上传的文件 ', file.name);
    const formData = new FormData();
    formData.append('file', file);

    // 注意：上传文件时，axios 会自动设置 Content-Type 为 multipart/form-data，所以这里不手动设置
    return apiClient({
        url: `/upload`, // 请根据实际情况修改上传接口的路径
        method: "POST",
        data: formData
    });
}